//
//  GYCenterManager.h
//  LockManagement
//
//  Created by apple on 2018/7/30.
//  Copyright © 2018年 yunjiazhineng. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>

@class GYCenterManager;
@class GYPeriphreal;

typedef NS_ENUM(NSUInteger, searchFlagType) {
    searchFlagTypeDefaut = 1 << 0,
    searchFlagTypeFinish = 1 << 1,//扫描时间到
    searchFlagTypeDisconnect = 1 << 2,//设备断开连接 删除设别
    searchFlagTypeAdded  = 1 << 3,//扫描到新设备
    searchFlagTypeChanged= 1 << 4,//已经扫描到设备，设备的状态改变
    searchFlagTypeDelete = 1 << 5 ,//设备超过时间未被发现
};
/**
 搜索到设备时,都会调用这个蓝牙设备

 @param peripheral 搜索到的设备
 @param searchType 通知外部, 对外设备的操作类型
 */
typedef void(^blueManagerSearchDeviceBlock)(GYPeriphreal *peripheral , searchFlagType searchType);

/**
 蓝牙状态发改变的时候回调blcok

 @param centerMnaager 中心设备manager
 @param state 状态
 */
typedef void(^blueManagerStateChangedBlock)(GYCenterManager *centerMnaager, CBManagerState state);

@interface GYCenterManager : NSObject

/** 中心管理者 */
@property (nonatomic, strong, readonly) CBCentralManager *centerMnaager;

/** 当前蓝牙状态改变block */
@property (nonatomic, copy) blueManagerStateChangedBlock blueManagerStateChangedCallBack;

/** 是否正在扫面设备 */
@property (nonatomic, getter=isScanning) BOOL scanning;

/** 已经连接上的设备  key:设备的identifier value:连接上的设备 */
@property (nonatomic, strong, readonly) NSMutableDictionary *connectedDeviceDic;

/** 已经扫描到的设备  key:设备的identifier value:连接上的设备 */
@property (nonatomic, strong, readonly) NSMutableDictionary *foundDeviceDic;


/**
 初始化

 @param queue manager运行的线程
 @return <#return value description#>
 */
- (instancetype)initWithQueue:(dispatch_queue_t)queue;

/**
 初始化
 
 @param queue manager运行的线程
 @param options 扫描条件
 @return <#return value description#>
 */
- (instancetype)initWithQueue:(dispatch_queue_t)queue options:(NSDictionary *)options;

/**
 扫描设备
 */
- (void)startScanDevice;

/**
 扫描设备

 @param searchDeviceCallBack <#searchDeviceCallBack description#>
 */
- (void)scanDeviceWithTimeCallback:(blueManagerSearchDeviceBlock)searchDeviceCallBack  ;

/**
 扫面设备

 @param timeInterval 扫描时间
 @param searchDeviceCallBack <#searchDeviceCallBack description#>
 */
- (void)scanDeviceWithTimeInterval:(NSTimeInterval)timeInterval
                          callBack:(blueManagerSearchDeviceBlock)searchDeviceCallBack  ;

/**
 根据条件扫描设备

 @param timeInterval 扫描时间
 @param service 服务条件
 @param options 扫描配置
 @param searchDeviceCallBack <#searchDeviceCallBack description#>
 */
- (void)scanDeviceWithTimeInterval:(NSTimeInterval)timeInterval
                          services:(NSArray *)service
                           options:(NSDictionary *)options
                          callBack:(blueManagerSearchDeviceBlock)searchDeviceCallBack ;


/**
 停止扫描 --- >  当扫描还没到时间, 但是已经找到了想要连接的设备  可以使用此方法来停止扫描
 */
- (void)stopScanDevice;

/**
 * 清空所有发现的设备
 */
- (void)removeAllScanFoundDevice ;

/**
 *  断开所有连接的设备
 */
- (void)disConnectAllDevice ;

/**
 寻找当前连接的设备

 @param peripheral <#peripheral description#>
 @return <#return value description#>
 */
- (GYPeriphreal *)searchDeviceWithPeripheral:(CBPeripheral *)peripheral ;

/**
 获取identifiers获取所有连接上的设备

 @param identifiers id数组
 @return <#return value description#>
 */
- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers;

/**
 根据服务id获取所有连接上的设备

 @param serviceUUIDS 服务id数组
 @return <#return value description#>
 */
- (NSArray *)retrieveConnectedPeripheralsWithServices:(NSArray *)serviceUUIDS;


/**
 一段时间没有扫描到该设备 通知外部做处理

 @param perpheral <#perpheral description#>
 */
- (void)foundDeviceTimeout:(GYPeriphreal *)perpheral;
@end
